package org.example.service.impl;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.collections4.CollectionUtils;
import org.example.mapper.SiteMapper;
import org.example.pojo.Site;
import org.example.pojo.SiteDto;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @program: big-event
 * @ClassName SiteService
 * @description:
 * @author: zsn
 * @create: 2024-07-17 14:33
 * @Version 1.0
 **/
@Service
public class SiteService {

    @Autowired
    private SiteMapper siteMapper;

    public List<SiteDto> queryAll(){
        List<SiteDto> datas = new ArrayList<>();
        //获取全部数据
        Map<String, String> param = new HashMap<>();
        param.put("code","2");
        List<Site> siteList = siteMapper.queryAll(param);
        if (siteList != null){
            //将这个数据赋值到dto里面
            List<SiteDto> siteDtoList = siteList.stream().map(site -> {
                SiteDto siteDto = new SiteDto();
                BeanUtils.copyProperties(site,siteDto);
                //时间格式化
                siteDto.setCreatedTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(site.createdTime));
                siteDto.setUpdatedTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(site.updatedTime));
                return siteDto;
            }).collect(Collectors.toList());

            //遍历全部的数据，利用递归思想，获取全部的子集
            siteDtoList.forEach(e ->{
                //判断当前id是否为其他数据的父id
                List<SiteDto> childrenList = getChildrenList(e.getId(), siteDtoList);
                //设置子集,如果到了最后一级，那么直接设置为null，不展示这个属性即可
                e.setSiteDtoList(CollectionUtils.isNotEmpty(childrenList) ? childrenList : null);
            });

            //获取所有的顶点数据，即最上层数据,该数据的pid为0
            //注意这个pid的数据类型，如果数据库为varchar则equals("0") 整型则为equals(0)
            List<SiteDto> siteDtoParents = siteDtoList.stream().filter(t -> t.getPid().equals(0L)).collect(Collectors.toList());
            datas.addAll(siteDtoParents);
        }
        return datas;
    }

    //获取全部的子集合
    public static List<SiteDto> getChildrenList(Long id,List<SiteDto> list){
        //便利全部数据，将需要的数据过滤出来
        return list.stream().filter(t-> t.getPid().equals(id)).collect(Collectors.toList());
    }
}